#include "Math.h"

std::ostream& operator << (std::ostream& out, const Matrix4x4 m) {
	out << "Matrix4x4:" 
		<< m._11 << " " << m._12 << " " << m._13 << " " << m._14 << " "
		<< m._21 << " " << m._22 << " " << m._23 << " " << m._24 << " "
		<< m._31 << " " << m._32 << " " << m._33 << " " << m._34 << " "
		<< m._41 << " " << m._42 << " " << m._43 << " " << m._44;
	return out;
}

bool operator == (const Matrix4x4 m1, Matrix4x4 m2) {
	if (   m1._11 == m2._11 && m1._12 == m2._12 && m1._13 == m2._13 && m1._14 == m2._14 
		&& m1._21 == m2._21 && m1._22 == m2._22 && m1._23 == m2._23 && m1._24 == m2._24
		&& m1._31 == m2._31 && m1._32 == m2._32 && m1._33 == m2._33 && m1._34 == m2._34
		&& m1._41 == m2._41 && m1._42 == m2._42 && m1._43 == m2._43 && m1._44 == m2._44) {
		return true;
	}
	return false;
}

class MathImpl : public Math {
public:
	virtual Matrix4x4 createIdentMatrix() {
		Matrix4x4 matrix4x4;
		matrix4x4._11 = 1;
		matrix4x4._22 = 1;
		matrix4x4._33 = 1;
		matrix4x4._44 = 1;
		return matrix4x4;
	}
};

Math& createMath() {
	return *new MathImpl();
}